using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;

namespace libcharakter
{
	[Serializable]
	public class Eigenschaft : Attribute
	{
		public Eigenschaft (string name, int value, Charakter charakter)
			: base(name, value, 0, TableColum.H, false, charakter)
		{
		}
        public override void Update(Charakter charakter)
        {
            base.Update(charakter);
        }
	}

	[Serializable]
	public class Mut : Eigenschaft
	{
		public Mut (int value, Charakter charakter) : base("Mut", value, charakter) { }

        public override void Update(Charakter charakter)
        {
            base.Update(charakter);
        }
	}
	[Serializable]
	public class Klugheit : Eigenschaft
	{
        public Klugheit (int value, Charakter charakter) : base("Klugheit", value, charakter) { }

        public override void Update(Charakter charakter)
        {
            base.Update(charakter);
        }
	}
	[Serializable]
	public class Intuition : Eigenschaft
	{
		public Intuition (int value, Charakter charakter) : base("Intuition", value, charakter) { }

        public override void Update(Charakter charakter)
        {
            base.Update(charakter);
        }
	}
	[Serializable]
	public class Charisma : Eigenschaft
	{
		public Charisma (int value, Charakter charakter) : base("Charisma", value, charakter) { }

        public override void Update(Charakter charakter)
        {
            base.Update(charakter);
        }
	}
	[Serializable]
	public class Fingerfertigkeit : Eigenschaft
	{
		public Fingerfertigkeit (int value, Charakter charakter) : base("Fingerfertigkeit", value, charakter) { }

        public override void Update(Charakter charakter)
        {
            base.Update(charakter);
        }
	}
	[Serializable]
	public class Gewandheit : Eigenschaft
	{
		public Gewandheit (int value, Charakter charakter) : base("Gewandheit", value, charakter) { }

        public override void Update(Charakter charakter)
        {

        }
	}
	[Serializable]
	public class Konstitution : Eigenschaft
	{
		public Konstitution (int value, Charakter charakter) : base("Konstitution", value, charakter) { }

        public override void Update(Charakter charakter)
        {
            base.Update(charakter);
        }
	}
	[Serializable]
	public class Koerperkraft : Eigenschaft
	{
		public Koerperkraft (int value, Charakter charakter) : base("Körperkraft", value, charakter) { }

        public override void Update(Charakter charakter)
        {
            base.Update(charakter);
        }
	}
	[Serializable]
	public class Geschwindigkeit : Eigenschaft
	{
		public Geschwindigkeit (int value, Charakter charakter) : base("Geschwindigkeit", value, charakter) { }

        public override void Update(Charakter charakter)
        {
            base.Update(charakter);
        }
	}
	[Serializable]
	public class Eigenschaften : Attribute
	{
		private List<Eigenschaft> m_werte;

		public Eigenschaft this [string n] 
		{
			get 
			{ 
				for (int i = 0; i < m_werte.Count; i++) 
				{
					if(n == m_werte[i].Name)
						return m_werte[i];
				}
				return null; 
			}
		}

		public Eigenschaften (Charakter charakter) 
			: this(8,8,8,8,8,8,8,8,1, charakter)
		{
		}
		public Eigenschaften(int mut, int kl, int ini, int ch, int ff, 
		                     int ge, int kon, int kk, int ges, Charakter charakter)
			: base("Eigenschaften", 0,0,TableColum.User, false, charakter)
		{
			m_werte = new List<Eigenschaft>();
			m_werte.Add(new Mut(mut, charakter));
			m_werte.Add(new Klugheit(kl, charakter));
			m_werte.Add(new Intuition(ini, charakter));
			m_werte.Add(new Charisma(ch, charakter));
			m_werte.Add(new Fingerfertigkeit(ff, charakter));
			m_werte.Add(new Gewandheit(ge, charakter));
			m_werte.Add(new Konstitution(kon, charakter));
			m_werte.Add(new Koerperkraft(kk, charakter));
			m_werte.Add(new Geschwindigkeit(ges, charakter));
		}
        internal void AddWunde()
        {
            this ["Geschwindigkeit"].Value -= 1;
            this ["Gewandheit"].Value -= 2;
        }
        internal void RemWunde()
        {
            this ["Geschwindigkeit"].Value += 1;
            this ["Gewandheit"].Value += 2;
        }

		public override string ToString ()
		{
			return string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}\n{8}\n", 
			                     this["Mut"], this["Klugheit"], this["Intuition"], this["Charisma"], 
			                     this["Fingerfertigkeit"], 
			                     this["Gewandheit"], this["Konstitution"],
			                     this["Koerperkraft"], this["Geschwindigkeit"]);
		}
        public override void Update (libcharakter.Charakter charakter)
        {
            foreach (var item in m_werte) 
            {
                item.Update(charakter);
            }
        }
        internal void SetValue(string name, int Value)
        {
            for (int i = 0; i < m_werte.Count; i++)
            {
                if (m_werte [i].Name == name)
                {
                    m_werte [i].Value = Value;
                    break;
                }
            }
        }
	}
}

